// 生成 json web token 和 解析 jwt
const jwt = require("jsonwebtoken");
const { promisify } = require("util"); // 将回调结果变成返回一个promise
const sign = promisify(jwt.sign);
const verify = promisify(jwt.verify);
const secret = "koa-video-project"; // 加密解密的秘钥

//生成token
module.exports.createToken = async (userInfo) => {
  const token = await sign(userInfo, secret, { expiresIn: 60 * 60 * 24 });
  return token;
};

//解密token
module.exports.verifyToken = function (required = true) {
  //返回一个中间件
  return async (ctx, next) => {
    let token = ctx.headers.authorization
    token = token ? token.split('Bearer ')[1] : null
    if (token) {
        try {
          const userInfo = await verify(token,secret)
          ctx.user = userInfo
          await next()
        } catch(err){
          ctx.throw(402,err)
        }
    } else if (required) { //没有token且必须校验
        ctx.throw(400,'token错误')
    } else {
       await next()
    }
  };
};
